package unipi.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import unipi.database.Department;
import unipi.database.Rights;
import unipi.database.User;
import unipi.helpers.ContactTypes;
import unipi.helpers.HTMLPages;
import unipi.helpers.LoginCookie;

public class Profile extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	public Profile()
	{
		super();
	}
	
	public void init() throws ServletException
	{
		
	
	}
	
	private String getDptHTML(String selectedDpt)
	{
		return HTMLPages.getDropDownList(Department.getDpts(), "department", selectedDpt, "--Επιλέξτε Τμήμα--");
	}
	
	private String getContactHTML()
	{
		return "<select name=\"type\">" +
				"<option value=\"" + ContactTypes.Email + "\">Email</option>" + 
				"<option value=\"" + ContactTypes.Phone + "\">Τηλέφωνο</option>" +
				"<option value=\"" + ContactTypes.Other + "\">Άλλο</option></select>";		
	}
	
	private String getContactNamesDropDown(String uid)
	{
		List<Map<String,String>> data = User.getUserContactData(uid);
		List<List<String>> list = new ArrayList<List<String>>();

		if(data != null)
		{
			for(Map<String, String> datarow : data)
			{
				List<String> row = new ArrayList<String>();
				row.add(datarow.get("id"));
				row.add(datarow.get("label") + "(" + datarow.get("contact") + ")");
				
				list.add(row);				
			}			
		}
		
		return HTMLPages.getDropDownList(list, "delcontact", "none", "--Επιλέξτε επαφή--");		
	}
	
	private String getVisitorPage(String uid, String visitorID)
	{		
		String content = "<h1>Προφίλ</h1>";
		
		Map<String, String> userData = User.getUserData(uid);
		
		if(userData == null) 
			content += "Παρουσιάστηκε πρόβλημα κατα την φόρτωση του προφίλ.";
		else
		{
			String pos = (userData.get("position")  == null)?"":userData.get("position") ;
			String hours = (userData.get("hours") == null)?"":userData.get("hours") ;
			String photo = (userData.get("photo") == null)?"images/profilePictures/placeholder.png":userData.get("photo");
		
			content += "<img class=\"profileImage\" src=\"" + photo + "\" alt=\"\"/>" +
					   "<table>" +
				   		"<tr><td>Όνομα Χρήστη: </td><td>" + userData.get("username") + "</td></tr>"+
				   		"<tr><td>Όνομα: </td><td>"+ userData.get("name") +"</td></tr>"+
				   		"<tr><td>Επώνυμο: </td><td>" + userData.get("surname") + "</td></tr>"+
				   		"<tr><td>Τμήμα: </td><td>" + userData.get("department") + "</td></tr>"+
				   		"<tr><td>Θέση: </td><td>" + pos + "</td></tr>"+
				   		"<tr><td>Ώρες/Εβδομάδα: </td><td>" + hours + "</td></tr>"+
				   		"<tr><td colspan=\"2\"><a class=\"genericLink\" href=\"Blog?uid=" + uid + "\">Εμφάνιση Ιστολογίου Χρήστη</a></td></tr>" +
				   		"<tr><td colspan=\"2\"><a class=\"genericLink\" href=\"ViewTasks?view=pending&uid=" + uid + "\">Εμφάνιση Τρεχόντων Εργασιών</a></td></tr>" +
				   		"<tr><td colspan=\"2\"><a class=\"genericLink\" href=\"ViewTasks?view=overdue&uid=" + uid + "\">Εμφάνιση Αργοπορημένων Εργασιών</a></td></tr>" +
				   		"<tr><td colspan=\"2\"><a class=\"genericLink\" href=\"ViewTasks?view=comingdue&uid=" + uid + "\">Εμφάνιση Επίγουσων Εργασιών</a></td></tr>" +
				   		"<tr><td colspan=\"2\"><a class=\"genericLink\" href=\"ViewTasks?view=notstarted&uid=" + uid + "\">Εμφάνιση Εργασιών που δεν έχουν αρχίσει</a></td></tr>" +
				   		"<tr><td colspan=\"2\"><a class=\"genericLink\" href=\"ViewTasks?view=shouldstarted&uid=" + uid + "\">Εμφάνιση Εργασιών που θα έπρεπε να έχουν ξεκινήσει</a></td></tr>" +
				   		"<tr><td colspan=\"2\"><a class=\"genericLink\" href=\"ViewTasks?view=completed&uid=" + uid + "\">Εμφάνιση Ολοκληρωμένων Εργασιών</a></td></tr>" +	
				   		"<tr><td colspan=\"2\"><a class=\"genericLink\" href=\"Calendar?view=cal&uid=" + uid + "\">Εμφάνιση Ημερολογίου Χρήστη</a></td></tr>" +	
				   		"<tr><td colspan=\"2\"><a class=\"genericLink\" href=\"Calendar?view=his&uid=" + uid + "\">Εμφάνιση Ιστορικού Χρήστη</a></td></tr>" +	
				   		"<tr><td colspan=\"2\"><a class=\"genericLink\" href=\"Statistics?id=" + uid + "\">Εμφάνιση Στατιστικών Χρήστη</a></td></tr>" +	
				   	"</table><br />";
			
			
			Map<String, Boolean> rights = Rights.getRights(uid);
			content += "<h2>Δικαιώματα Χρήστη</h2>";
			if(rights == null)
				content += "Τα δικαιώματα του χρήστη δεν μπόρεσαν να εμφανιστούν.";
			else
			{
				content += "Ο χρήστης " + ((rights.get("taskRights"))?"":"δεν") + " έχει δικαιώματα εργασιών.<br />";
				content += "O χρήστης " + ((rights.get("userRights"))?"":"δεν") + " έχει δικαιώματα χρηστών.<br />";
				content += "Ο χρήστης " + ((rights.get("dptRights"))?"":"δεν") + " έχει δικαιώματα τμημάτων.<br />";
			}					
			
			content += "<h2>Στοιχεία επικοινωνίας</h2>";
			content += "<a class=\"genericLink\" href=\"SendMessage?id=" + uid + "\">Αποστολή Προσωπικού Μηνύματος</a>";
			
			List<Map<String, String>> contacts = User.getUserContactData(uid);
			String emails = "";
			String phones = "";
			String other = "";
			
			if(contacts != null)
				for(Map<String, String> contact : contacts)
				{
					String line =  contact.get("label") + ": " + contact.get("contact") + "<br />";
					
					if(contact.get("type").equals(ContactTypes.Email.toString()) ||
					   contact.get("type").equals(ContactTypes.MainMail.toString()))
						emails += line;
					else if(contact.get("type").equals(ContactTypes.Phone.toString()))
						phones += line;
					else
						other += line;				
				}
			
			content += "<h3>Emails</h3>" + (emails.equals("")?"Ο χρήστης δεν έχει προσθέσει emails":emails);
			content += "<h3>Τηλέφωνα</h3>" + (phones.equals("")?"Ο χρήστης δεν έχει προσθέσει τηλέφωνα":phones);	
			content += "<h3>Άλλα</h3>" + (other.equals("")?"Ο χρήστης δεν έχει προσθέσει άλλα στοιχεία επικοινωνίας":other);	
		
		}		
		
		return HTMLPages.getGeneralPage(content, visitorID);
	}
	
	private String getPage(String uid, String[] messages)
	{
		if(messages.length != 4) return null;
		
		Map<String, String> userData = User.getUserData(uid);
		
		String content = "<h1>Προφίλ</h1>";
		
		if(userData == null) content += "Παρουσιάστηκε πρόβλημα κατα την φόρτωση του προφίλ σας." +
										"Δοκιμάστε να επαναφορτώσετε την σελίδα.";
		else
		{
			String pos = (userData.get("position")  == null)?"":userData.get("position") ;
			String hours = (userData.get("hours") == null)?"":userData.get("hours") ;
			String photo = (userData.get("photo") == null)?"images/profilePictures/placeholder.png":userData.get("photo");
			
			content += "<h2>Επεξεργασία Στοιχείων Προφίλ</h2>" +
						"<img class=\"profileImage\" src=\"" + photo + "\" alt=\"\"/>" +
					   HTMLPages.getSubmitForm("EditProfile",
					   new String[]{
						   		"*Όνομα",
						   		"*Επώνυμο",
						   		"*Τμήμα",
						   		"Θέση",
						   		"*Ώρες/Εβδομάδα",
						   		"Όνομα Χρήστη",
						   		"Προηγούμενος Κωδικός",
						   		"Νέος Κωδικός" },
					   new String[]{
							   "<input class=\"smallInput\" name=\"name\" type=\"text\" value=\"" + userData.get("name") + "\" />",
							   "<input class=\"smallInput\" name=\"surname\" type=\"text\" value=\"" + userData.get("surname") + "\" />",
							   "<div class=\"ddldivstyle\">" + getDptHTML(userData.get("dptID")) + "</div>",
							   "<input class=\"smallInput\" name=\"position\" type=\"text\" value=\"" + pos + "\" />",
							   "<input class=\"smallInput\" name=\"hours\" type=\"text\" value=\"" + hours + "\" />",
							   "<input class=\"smallInput\" name=\"username\" type=\"text\" value=\"" + userData.get("username") + "\" />",
							   "<input class=\"smallInput\" name=\"oldpass\" type=\"password\" value=\"\" />",
							   "<input class=\"smallInput\" name=\"newpass\" type=\"password\" value=\"\" />",
							   
					   }, "Ενημερωση Στοιχειων") +
						"Αν αλλάξετε τα πεδία με (*) τότε ο λογαριασμός σας θα πρέπει να επαναεγκριθεί.<br />" + messages[0]; 
			
			content += "<h2>Ανανέωση Εικόνας Προφίλ</h2>" +
						HTMLPages.getSubmitForm("UploadPicture", 
							 new String[]{"Φωτογραφία"},
							 new String[] {"<div class=\"fileBrowse\"><input name=\"fileupload\" type=\"file\" /></div>"},
							"Ανανέωση Εικόνας", "enctype=\"multipart/form-data\"") + messages[1];
			
			content += "<h2>Προσθήκη Επαφών</h2>" +
						HTMLPages.getSubmitForm("AddContact", 
						new String[] {
								"Είδος Επαφής",
								"Τίτλος Επαφής",
								"Επαφή"} ,
						new String[] {"<div class=\"ddldivstyle\">" + getContactHTML() + "</div>",
								"<input class=\"smallInput\" name=\"label\" type=\"text\" value=\"\" />",
								"<input class=\"smallInput\" name=\"contact\" type=\"text\" value=\"\" />",
								}, "Προσθηκη Επαφης") + messages[2];
			
			content += "<h2>Διαγραφή Επαφών</h2>" +
						HTMLPages.getSubmitForm("DeleteContact",
								new String[]{"Όνομα επαφής"},
								new String[]{"<div class=\"ddldivstyle\">" + getContactNamesDropDown(uid) + "</div>"},
								"Διαγραφη") + messages[3];
			
		}

		
		return HTMLPages.getGeneralPage(content, uid);	
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		if(!LoginCookie.authCookie(request))
			response.sendRedirect("Login");
		else
		{
			String uid = LoginCookie.Get(request)[0];
			request.setCharacterEncoding("UTF-8");
			String[] message = (String[])request.getAttribute("message");
			
			response.setContentType("text/html; charset=UTF-8");	
			PrintWriter out = response.getWriter();
			
			out.println(getPage(uid, message));
			
			out.close();			
		}
		
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		if(!LoginCookie.authCookie(request))
			response.sendRedirect("Login");
		else
		{			
			String uid = LoginCookie.Get(request)[0];
			
			request.setCharacterEncoding("UTF-8");
			String userID = request.getParameter("id");
			
			if(userID == null) userID = uid;
			
			response.setContentType("text/html; charset=UTF-8");	
			PrintWriter out = response.getWriter();
			
			if(userID.equals(uid))
				out.println(getPage(uid, new String[]{"", "", "", ""}));
			else
				out.println(getVisitorPage(userID, uid));
			
			out.close();	
		}
	}
	
}
